<?php
namespace Wxpay\Controller;
use Think\Controller;
use Org\Util\Wxpay\JsApiPay;
use Org\Util\Wxpay\MicroPay;
use Org\Util\Wxpay\NativePay;
vendor('Wxpay.lib.WxPay#Api');

class DealController extends Controller
{
    protected function log(){
        $log_addr = DOC_ROOT."/Public/logs/".date('Y-m-d').'.log';
        $log = R('Common/log', array($log_addr));
        return $log;
    }

    /**--JSAPI支付--**/
    public function jsapi(){
        //error_reporting(E_ERROR);

        //①、获取用户openid
        $tools = new JsApiPay();
        $openId = $tools->GetOpenid();

        //②、统一下单
        $input = new \WxPayUnifiedOrder();
        $input->SetBody("test");
        $input->SetAttach("test");
        $input->SetOut_trade_no(\WxPayConfig::MCHID.date("YmdHis"));
        $input->SetTotal_fee("1");
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("test");
        $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openId);
        $order = \WxPayApi::unifiedOrder($input);
        echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
        R('Common/printf_info', array($order));
        $jsApiParameters = $tools->GetJsApiParameters($order);

        //获取共享收货地址js函数参数
        $editAddress = $tools->GetEditAddressParameters();

        //③、在支持成功回调通知中处理成功之后的事宜，见 notify.php
        /**
         * 注意：
         * 1、当你的回调地址不可访问的时候，回调通知会失败，可以通过查询订单来确认支付是否成功
         * 2、jsapi支付时需要填入用户openid，WxPay.JsApiPay.php中有获取openid流程 （文档可以参考微信公众平台“网页授权接口”，
         * 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html）
         */

        $this->assign('jsApiParameters',$jsApiParameters);
        $this->assign('editAddress',$editAddress);
        $this->display();
    }
    /**--刷卡支付--**/
    public function micropay(){
        //error_reporting(E_ERROR);
        $out_trade_no = I('out_trade_no'); //商户订单号
        $auth_code = I('auth_code'); //授权码
        $err_codes = C('ERROR_CODE');
        if($auth_code != ""){
            header("Content-type:text/html;charset=utf-8");
            $total_fee = floatval($_REQUEST['total_fee']) * 100; //总金额（单位：分）
            //整理支付时输入数据
            $input = new \WxPayMicroPay();
            $input->SetBody($_REQUEST['product_type']);
            $input->SetOut_trade_no(\WxPayConfig::MCHID.date("YmdHis"));
            $input->SetTotal_fee($total_fee);
            $input->SetAuth_code($auth_code);
            //调用支付接口
            $microPay = new MicroPay();
            //微信端返回交易信息
            $result = $microPay->pay($input);
            $result['err_codes'] = $err_codes;
            if(!isset($result['state'])){
                $this->ajaxReturn($result);
            }elseif($result['state'] != true){
                $this->ajaxReturn($result);
            }else{
                //整理交易信息
                $data = json_decode(json_encode($result),true);
                $data['product_type'] = $_REQUEST['product_type']; //商品类型
                $data['is_enough'] = $_REQUEST['is_enough']; //是否足额
                $result['state'] = true;
                $this->ajaxReturn($result);
            }
            //打印交易信息
            R('Common/printf_info', array($result));
            //交易信息保存到日志文件
            $this->log()->INFO($data);
            //交易信息保存到本地数据库
            M('wxpay')->data($data)->add();
        }elseif($out_trade_no != ''){
            $result = I('param.');
            R('Common/printf_info', array($result));
        }

        /**
         * 注意：
         * 1、提交被扫之后，返回系统繁忙、用户输入密码等错误信息时需要循环查单以确定是否支付成功
         * 2、多次（一半10次）确认都未明确成功时需要调用撤单接口撤单，防止用户重复支付
         */
        $this->display();
    }
    /**--扫描支付--**/
    public function native(){
        //error_reporting(E_ERROR);

        //模式一
        /**
         * 流程：
         * 1、组装包含支付信息的url，生成二维码
         * 2、用户扫描二维码，进行支付
         * 3、确定支付之后，微信服务器会回调预先配置的回调地址，在【微信开放平台-微信支付-支付配置】中进行配置
         * 4、在接到回调通知之后，用户进行统一下单支付，并返回支付信息以完成支付（见：native_notify.php）
         * 5、支付完成之后，微信服务器会通知支付成功
         * 6、在支付成功通知中需要查单确认是否真正支付成功（见：notify.php）
         */
        $notify = new NativePay();
        $url1 = $notify->GetPrePayUrl("123456789");

        //模式二
        /**
         * 流程：
         * 1、调用统一下单，取得code_url，生成二维码
         * 2、用户扫描二维码，进行支付
         * 3、支付完成之后，微信服务器会通知支付成功
         * 4、在支付成功通知中需要查单确认是否真正支付成功（见：notify.php）
         */
        $input = new \WxPayUnifiedOrder();
        $input->SetBody("test");
        $input->SetAttach("test");
        $input->SetOut_trade_no(\WxPayConfig::MCHID.date("YmdHis"));
        $input->SetTotal_fee("1");
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("test");
        $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
        $input->SetTrade_type("NATIVE");
        $input->SetProduct_id("123456789");
        $result = $notify->GetPayUrl($input);
        $url2 = $result["code_url"];

        $this->assign('url1',$url1);
        $this->assign('url2',$url2);
        $this->display();
    }
    /**--订单退款--**/
    public function refund(){
        error_reporting(E_ERROR);

        if(isset($_REQUEST["transaction_id"]) && $_REQUEST["transaction_id"] != ""){
            $transaction_id = $_REQUEST["transaction_id"];
            $total_fee = $_REQUEST["total_fee"];
            $refund_fee = $_REQUEST["refund_fee"];
            $input = new \WxPayRefund();
            $input->SetTransaction_id($transaction_id);
            $input->SetTotal_fee($total_fee);
            $input->SetRefund_fee($refund_fee);
            $input->SetOut_refund_no(\WxPayConfig::MCHID.date("YmdHis"));
            $input->SetOp_user_id(\WxPayConfig::MCHID);
            R('Common/printf_info', array(\WxPayApi::refund($input)));
            exit();
        }

        //$_REQUEST["out_trade_no"]= "122531270220150304194108";
        ///$_REQUEST["total_fee"]= "1";
        //$_REQUEST["refund_fee"] = "1";
        if(isset($_REQUEST["out_trade_no"]) && $_REQUEST["out_trade_no"] != ""){
            $out_trade_no = $_REQUEST["out_trade_no"];
            $total_fee = $_REQUEST["total_fee"];
            $refund_fee = $_REQUEST["refund_fee"];
            $input = new \WxPayRefund();
            $input->SetOut_trade_no($out_trade_no);
            $input->SetTotal_fee($total_fee);
            $input->SetRefund_fee($refund_fee);
            $input->SetOut_refund_no(\WxPayConfig::MCHID.date("YmdHis"));
            $input->SetOp_user_id(\WxPayConfig::MCHID);
            R('Common/printf_info', array(\WxPayApi::refund($input)));
            exit();
        }
        $this->display();
    }
}